package aom.ju.ss.view.base.jzvd;

import android.app.AlertDialog;
import android.app.Dialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.graphics.Color;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.PopupWindow;
import android.widget.ProgressBar;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

import aom.ju.ss.R;


/**
 * Created by Nathen
 * On 2016/04/18 16:15
 */
public class JzvdStd extends Jzvd {

    public static long LAST_GET_BATTERYLEVEL_TIME = 0;
    public static int LAST_GET_BATTERYLEVEL_PERCENT = 70;
    protected static Timer DISMISS_CONTROL_VIEW_TIMER;

    public ImageView thumbImageView;
    public TextView replayTextView;
    public TextView mRetryBtn;
    public LinearLayout mRetryLayout;
    protected DismissControlViewTimerTask mDismissControlViewTimerTask;


    public JzvdStd(Context context) {
        super(context);
    }

    public JzvdStd(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public void init(Context context) {
        super.init(context);
        thumbImageView = findViewById(R.id.thumb);
        replayTextView = findViewById(R.id.replay_text);
        mRetryBtn = findViewById(R.id.retry_btn);
        mRetryLayout = findViewById(R.id.retry_layout);

        thumbImageView.setOnClickListener(this);
        mRetryBtn.setOnClickListener(this);
    }

    public void setUp(JZDataSource jzDataSource, int screen, Class mediaInterfaceClass) {
        super.setUp(jzDataSource, screen, mediaInterfaceClass);
        setScreen(screen);
    }


    @Override
    public int getLayoutId() {
        return R.layout.jz_layout_std;
    }

    @Override
    public void onStateNormal() {
        super.onStateNormal();
        changeUiToNormal();
    }

    @Override
    public void onStatePreparing() {
        super.onStatePreparing();
        changeUiToPreparing();
    }

    @Override
    public void onStatePlaying() {
        super.onStatePlaying();
        changeUiToPlayingClear();
    }

    @Override
    public void onStatePause() {
        super.onStatePause();
        changeUiToPauseShow();
        cancelDismissControlViewTimer();
    }

    @Override
    public void onStateError() {
        super.onStateError();
        changeUiToError();
    }

    @Override
    public void onStateAutoComplete() {
        super.onStateAutoComplete();
        changeUiToComplete();
        cancelDismissControlViewTimer();
    }

    @Override
    public void changeUrl(int urlMapIndex, long seekToInAdvance) {
        super.changeUrl(urlMapIndex, seekToInAdvance);
        startButton.setVisibility(INVISIBLE);
        replayTextView.setVisibility(View.GONE);
        mRetryLayout.setVisibility(View.GONE);
    }

    @Override
    public void changeUrl(JZDataSource jzDataSource, long seekToInAdvance) {
        super.changeUrl(jzDataSource, seekToInAdvance);
        startButton.setVisibility(INVISIBLE);
        replayTextView.setVisibility(View.GONE);
        mRetryLayout.setVisibility(View.GONE);
    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        int id = v.getId();
        if (id == R.id.surface_container) {
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    break;
                case MotionEvent.ACTION_MOVE:
                    break;
                case MotionEvent.ACTION_UP:
                    startDismissControlViewTimer();
                    if (mChangePosition) {
                        long duration = getDuration();
                        int progress = (int) (mSeekTimePosition * 100 / (duration == 0 ? 1 : duration));
                    }
                    if (!mChangePosition && !mChangeVolume) {
                        onClickUiToggle();
                    }
                    break;
            }
        }
//        else if (id == R.id.bottom_seek_progress) {
//            switch (event.getAction()) {
//                case MotionEvent.ACTION_DOWN:
//                    cancelDismissControlViewTimer();
//                    break;
//                case MotionEvent.ACTION_UP:
//                    startDismissControlViewTimer();
//                    break;
//            }
//        }
        return super.onTouch(v, event);
    }

    @Override
    public void onClick(View v) {
        super.onClick(v);
        int i = v.getId();
        if (i == R.id.thumb) {
            if (jzDataSource == null || jzDataSource.urlsMap.isEmpty() || jzDataSource.getCurrentUrl() == null) {
                Toast.makeText(getContext(), "地址失效", Toast.LENGTH_SHORT).show();
                return;
            }
            if (state == STATE_NORMAL) {
                if (!jzDataSource.getCurrentUrl().toString().startsWith("file") &&
                        !jzDataSource.getCurrentUrl().toString().startsWith("/") &&
                        !JZUtils.isWifiConnected(getContext()) && !WIFI_TIP_DIALOG_SHOWED) {
                    showWifiDialog();
                    return;
                }
                startVideo();
            } else if (state == STATE_AUTO_COMPLETE) {
                onClickUiToggle();
            }
        } else if (i == R.id.surface_container) {
            startDismissControlViewTimer();
        } else if (i == R.id.back) {
            backPress();
        }
//        else if (i == R.id.back_tiny) {
//            clearFloatScreen();
//        } else if (i == R.id.clarity) {
//            LayoutInflater inflater = (LayoutInflater) getContext()
//                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
//            final LinearLayout layout = (LinearLayout) inflater.inflate(R.layout.jz_layout_clarity, null);
//
//            View.OnClickListener mQualityListener = v1 -> {
//                int index = (int) v1.getTag();
//                changeUrl(index, getCurrentPositionWhenPlaying());
//                clarity.setText(jzDataSource.getCurrentKey().toString());
//                for (int j = 0; j < layout.getChildCount(); j++) {//设置点击之后的颜色
//                    if (j == jzDataSource.currentUrlIndex) {
//                        ((TextView) layout.getChildAt(j)).setTextColor(Color.parseColor("#fff85959"));
//                    } else {
//                        ((TextView) layout.getChildAt(j)).setTextColor(Color.parseColor("#ffffff"));
//                    }
//                }
//                if (clarityPopWindow != null) {
//                    clarityPopWindow.dismiss();
//                }
//            };
//
//            for (int j = 0; j < jzDataSource.urlsMap.size(); j++) {
//                String key = jzDataSource.getKeyFromDataSource(j);
//                TextView clarityItem = (TextView) View.inflate(getContext(), R.layout.jz_layout_clarity_item, null);
//                clarityItem.setText(key);
//                clarityItem.setTag(j);
//                layout.addView(clarityItem, j);
//                clarityItem.setOnClickListener(mQualityListener);
//                if (j == jzDataSource.currentUrlIndex) {
//                    clarityItem.setTextColor(Color.parseColor("#fff85959"));
//                }
//            }
//
//            clarityPopWindow = new PopupWindow(layout, FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT, true);
//            clarityPopWindow.setContentView(layout);
//            clarityPopWindow.showAsDropDown(clarity);
//            layout.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
//            int offsetX = clarity.getMeasuredWidth() / 3;
//            int offsetY = clarity.getMeasuredHeight() / 3;
//            clarityPopWindow.update(clarity, -offsetX, -offsetY, Math.round(layout.getMeasuredWidth() * 2), layout.getMeasuredHeight());
//        }
        else if (i == R.id.retry_btn) {
            if (jzDataSource.urlsMap.isEmpty() || jzDataSource.getCurrentUrl() == null) {
                Toast.makeText(getContext(), "播放地址无效", Toast.LENGTH_SHORT).show();
                return;
            }
            if (!jzDataSource.getCurrentUrl().toString().startsWith("file") && !
                    jzDataSource.getCurrentUrl().toString().startsWith("/") &&
                    !JZUtils.isWifiConnected(getContext()) && !WIFI_TIP_DIALOG_SHOWED) {
                showWifiDialog();
                return;
            }
            addTextureView();
            onStatePreparing();
        }
    }

    @Override
    public void setScreenNormal() {
        super.setScreenNormal();
//        fullscreenButton.setImageResource(R.drawable.jz_enlarge);
//        changeStartButtonSize((int) getResources().getDimension(R.dimen.jz_start_button_w_h_normal));
    }

    @Override
    public void setScreenFullscreen() {
        super.setScreenFullscreen();
        //进入全屏之后要保证原来的播放状态和ui状态不变，改变个别的ui
//        fullscreenButton.setImageResource(R.drawable.jz_shrink);
//        changeStartButtonSize((int) getResources().getDimension(R.dimen.jz_start_button_w_h_fullscreen));
        setSystemTimeAndBattery();
    }

    @Override
    public void setScreenTiny() {
        super.setScreenTiny();
        setAllControlsVisiblity(View.INVISIBLE, View.INVISIBLE, View.INVISIBLE,
                View.INVISIBLE, View.INVISIBLE, View.INVISIBLE, View.INVISIBLE);
    }

    @Override
    public void showWifiDialog() {
        super.showWifiDialog();
//        AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
//        builder.setMessage(getResources().getString(R.string.tips_not_wifi));
//        builder.setPositiveButton(getResources().getString(R.string.tips_not_wifi_confirm), (dialog, which) -> {
//            dialog.dismiss();
//            startVideo();
//            WIFI_TIP_DIALOG_SHOWED = true;
//        });
//        builder.setNegativeButton(getResources().getString(R.string.tips_not_wifi_cancel), (dialog, which) -> {
//            dialog.dismiss();
//            clearFloatScreen();
//        });
//        builder.setOnCancelListener(DialogInterface::dismiss);
//        builder.create().show();
    }

    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {
        super.onStartTrackingTouch(seekBar);
        cancelDismissControlViewTimer();
    }

    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {
        super.onStopTrackingTouch(seekBar);
        startDismissControlViewTimer();
    }

    public void onClickUiToggle() {//这是事件
//        if (bottomContainer.getVisibility() != View.VISIBLE) {
//            setSystemTimeAndBattery();
//            clarity.setText(jzDataSource.getCurrentKey().toString());
//        }
//        if (state == STATE_PREPARING) {
//            changeUiToPreparing();
//            if (bottomContainer.getVisibility() == View.VISIBLE) {
//            } else {
//                setSystemTimeAndBattery();
//            }
//        } else if (state == STATE_PLAYING) {
//            if (bottomContainer.getVisibility() == View.VISIBLE) {
//                changeUiToPlayingClear();
//            } else {
//                changeUiToPlayingShow();
//            }
//        } else if (state == STATE_PAUSE) {
//            if (bottomContainer.getVisibility() == View.VISIBLE) {
//                changeUiToPauseClear();
//            } else {
//                changeUiToPauseShow();
//            }
//        }
    }

    public void setSystemTimeAndBattery() {
        if ((System.currentTimeMillis() - LAST_GET_BATTERYLEVEL_TIME) > 30000) {
            LAST_GET_BATTERYLEVEL_TIME = System.currentTimeMillis();
            getContext().registerReceiver(
                    battertReceiver,
                    new IntentFilter(Intent.ACTION_BATTERY_CHANGED)
            );
        } else {
            setBatteryLevel();
        }
    }

    public void setBatteryLevel() {
        int percent = LAST_GET_BATTERYLEVEL_PERCENT;
//        if (percent < 15) {
//            batteryLevel.setBackgroundResource(R.drawable.jz_battery_level_10);
//        } else if (percent >= 15 && percent < 40) {
//            batteryLevel.setBackgroundResource(R.drawable.jz_battery_level_30);
//        } else if (percent >= 40 && percent < 60) {
//            batteryLevel.setBackgroundResource(R.drawable.jz_battery_level_50);
//        } else if (percent >= 60 && percent < 80) {
//            batteryLevel.setBackgroundResource(R.drawable.jz_battery_level_70);
//        } else if (percent >= 80 && percent < 95) {
//            batteryLevel.setBackgroundResource(R.drawable.jz_battery_level_90);
//        } else if (percent >= 95 && percent <= 100) {
//            batteryLevel.setBackgroundResource(R.drawable.jz_battery_level_100);
//        }
    }

    public void onCLickUiToggleToClear() {
//        if (state == STATE_PREPARING) {
//            if (bottomContainer.getVisibility() == View.VISIBLE) {
//                changeUiToPreparing();
//            } else {
//            }
//        } else if (state == STATE_PLAYING) {
//            if (bottomContainer.getVisibility() == View.VISIBLE) {
//                changeUiToPlayingClear();
//            } else {
//            }
//        } else if (state == STATE_PAUSE) {
//            if (bottomContainer.getVisibility() == View.VISIBLE) {
//                changeUiToPauseClear();
//            } else {
//            }
//        } else if (state == STATE_AUTO_COMPLETE) {
//            if (bottomContainer.getVisibility() == View.VISIBLE) {
//                changeUiToComplete();
//            } else {
//            }
//        }
    }


    @Override
    public void onProgress(int progress, long position, long duration) {
        super.onProgress(progress, position, duration);
    }

    @Override
    public void setBufferProgress(int bufferProgress) {
        super.setBufferProgress(bufferProgress);
    }

    @Override
    public void resetProgressAndTime() {
        super.resetProgressAndTime();
    }

    public void changeUiToNormal() {
        switch (screen) {
            case SCREEN_NORMAL:
            case SCREEN_FULLSCREEN:
                setAllControlsVisiblity(View.VISIBLE, View.INVISIBLE, View.VISIBLE,
                        View.INVISIBLE, View.VISIBLE, View.INVISIBLE, View.INVISIBLE);
                updateStartImage();
                break;
            case SCREEN_TINY:
                break;
        }
    }

    public void changeUiToPreparing() {
        switch (screen) {
            case SCREEN_NORMAL:
            case SCREEN_FULLSCREEN:
                setAllControlsVisiblity(View.INVISIBLE, View.INVISIBLE, View.INVISIBLE,
                        View.VISIBLE, View.VISIBLE, View.INVISIBLE, View.INVISIBLE);
                updateStartImage();
                break;
            case SCREEN_TINY:
                break;
        }

    }


    public void changeUiToPlayingClear() {
        switch (screen) {
            case SCREEN_NORMAL:
            case SCREEN_FULLSCREEN:
                setAllControlsVisiblity(View.INVISIBLE, View.INVISIBLE, View.INVISIBLE,
                        View.INVISIBLE, View.INVISIBLE, View.VISIBLE, View.INVISIBLE);
                break;
            case SCREEN_TINY:
                break;
        }

    }

    public void changeUiToPauseShow() {
        switch (screen) {
            case SCREEN_NORMAL:
            case SCREEN_FULLSCREEN:
                setAllControlsVisiblity(View.VISIBLE, View.VISIBLE, View.VISIBLE,
                        View.INVISIBLE, View.INVISIBLE, View.INVISIBLE, View.INVISIBLE);
                updateStartImage();
                break;
            case SCREEN_TINY:
                break;
        }
    }


    public void changeUiToComplete() {
        switch (screen) {
            case SCREEN_NORMAL:
            case SCREEN_FULLSCREEN:
                setAllControlsVisiblity(View.VISIBLE, View.INVISIBLE, View.VISIBLE,
                        View.INVISIBLE, View.VISIBLE, View.INVISIBLE, View.INVISIBLE);
                updateStartImage();
                break;
            case SCREEN_TINY:
                break;
        }

    }

    public void changeUiToError() {
        switch (screen) {
            case SCREEN_NORMAL:
                setAllControlsVisiblity(View.INVISIBLE, View.INVISIBLE, View.VISIBLE,
                        View.INVISIBLE, View.INVISIBLE, View.INVISIBLE, View.VISIBLE);
                updateStartImage();
                break;
            case SCREEN_FULLSCREEN:
                setAllControlsVisiblity(View.VISIBLE, View.INVISIBLE, View.VISIBLE,
                        View.INVISIBLE, View.INVISIBLE, View.INVISIBLE, View.VISIBLE);
                updateStartImage();
                break;
            case SCREEN_TINY:
                break;
        }

    }

    public void setAllControlsVisiblity(int topCon, int bottomCon, int startBtn, int loadingPro,
                                        int thumbImg, int bottomPro, int retryLayout) {
//        topContainer.setVisibility(topCon);
//        bottomContainer.setVisibility(bottomCon);
        startButton.setVisibility(startBtn);
        thumbImageView.setVisibility(thumbImg);
        mRetryLayout.setVisibility(retryLayout);
    }

    public void updateStartImage() {
        if (state == STATE_PLAYING) {
            startButton.setVisibility(VISIBLE);
            startButton.setImageResource(R.drawable.jz_pause_pressed);
            replayTextView.setVisibility(GONE);
        } else if (state == STATE_ERROR) {
            startButton.setVisibility(INVISIBLE);
            replayTextView.setVisibility(GONE);
        } else if (state == STATE_AUTO_COMPLETE) {
            startButton.setVisibility(VISIBLE);
            startButton.setImageResource(R.drawable.jz_restart_pressed);
            replayTextView.setVisibility(VISIBLE);
        } else {
            startButton.setImageResource(R.drawable.jz_play_normal);
            replayTextView.setVisibility(GONE);
        }
    }

    @Override
    public void showProgressDialog(float deltaX, String seekTime, long seekTimePosition, String totalTime, long totalTimeDuration) {
        super.showProgressDialog(deltaX, seekTime, seekTimePosition, totalTime, totalTimeDuration);
//        if (mProgressDialog == null) {
//            View localView = LayoutInflater.from(getContext()).inflate(R.layout.jz_dialog_progress, null);
//            mDialogProgressBar = localView.findViewById(R.id.duration_progressbar);
//            mDialogSeekTime = localView.findViewById(R.id.tv_current);
//            mDialogTotalTime = localView.findViewById(R.id.tv_duration);
//            mDialogIcon = localView.findViewById(R.id.duration_image_tip);
//            mProgressDialog = createDialogWithView(localView);
//        }
//        if (!mProgressDialog.isShowing()) {
//            mProgressDialog.show();
//        }
//
//        mDialogSeekTime.setText(seekTime);
//        mDialogTotalTime.setText(" / " + totalTime);
//        mDialogProgressBar.setProgress(totalTimeDuration <= 0 ? 0 : (int) (seekTimePosition * 100 / totalTimeDuration));
//        if (deltaX > 0) {
//            mDialogIcon.setBackgroundResource(R.drawable.jz_forward_icon);
//        } else {
//            mDialogIcon.setBackgroundResource(R.drawable.jz_backward_icon);
//        }
//        onCLickUiToggleToClear();
    }

    @Override
    public void dismissProgressDialog() {
        super.dismissProgressDialog();
    }

    @Override
    public void showVolumeDialog(float deltaY, int volumePercent) {
        super.showVolumeDialog(deltaY, volumePercent);
//
    }

    @Override
    public void dismissVolumeDialog() {
        super.dismissVolumeDialog();

    }

    @Override
    public void showBrightnessDialog(int brightnessPercent) {
        super.showBrightnessDialog(brightnessPercent);
//
        onCLickUiToggleToClear();
    }

    @Override
    public void dismissBrightnessDialog() {
        super.dismissBrightnessDialog();

    }



    public void startDismissControlViewTimer() {
        cancelDismissControlViewTimer();
        DISMISS_CONTROL_VIEW_TIMER = new Timer();
        mDismissControlViewTimerTask = new DismissControlViewTimerTask();
        DISMISS_CONTROL_VIEW_TIMER.schedule(mDismissControlViewTimerTask, 2500);
    }

    public void cancelDismissControlViewTimer() {
        if (DISMISS_CONTROL_VIEW_TIMER != null) {
            DISMISS_CONTROL_VIEW_TIMER.cancel();
        }
        if (mDismissControlViewTimerTask != null) {
            mDismissControlViewTimerTask.cancel();
        }

    }

    @Override
    public void onAutoCompletion() {
        super.onAutoCompletion();
        cancelDismissControlViewTimer();
    }

    @Override
    public void reset() {
        super.reset();
        cancelDismissControlViewTimer();
    }

    public void dissmissControlView() {
        if (state != STATE_NORMAL
                && state != STATE_ERROR
                && state != STATE_AUTO_COMPLETE) {
            post(() -> {
//                bottomContainer.setVisibility(View.INVISIBLE);
//                topContainer.setVisibility(View.INVISIBLE);
                startButton.setVisibility(View.INVISIBLE);
                if (screen != SCREEN_TINY) {
                }
            });
        }
    }

    public class DismissControlViewTimerTask extends TimerTask {

        @Override
        public void run() {
            dissmissControlView();
        }
    }

    private BroadcastReceiver battertReceiver = new BroadcastReceiver() {
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (Intent.ACTION_BATTERY_CHANGED.equals(action)) {
                int level = intent.getIntExtra("level", 0);
                int scale = intent.getIntExtra("scale", 100);
                int percent = level * 100 / scale;
                LAST_GET_BATTERYLEVEL_PERCENT = percent;
                setBatteryLevel();
                try {
                    getContext().unregisterReceiver(battertReceiver);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    };
}
